package com.baizhi.thread;

import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * 创建线程方式三：实现Callable接口，并重写call方法
 *
 * 我们已经学过两种创建线程的方式
 *  1. 第一种： 继承Thread类，重写run方法
 *  2. 第二种： 实现Runnable接口，重写run方法
 *
 *  以上两种方式有两个弊端
 *      1. run 方法没有返回值
 *      2. 不能抛出异常
 *
 *基于上面两个不足，JDK1.5以后退出了第三种创建线程的方式： 实现Callable接口，并重写call方法
 *  实现Callable接口的方式的好处
 *      1. 有返回值
 *      2. 能抛出异常
 *
 *
 */
public class ThreadDemo6 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //创建任务对象
        MyCallable c1 = new MyCallable();
        //创建执行器对象
        FutureTask ft = new FutureTask(c1);
        //创建线程对象
        Thread t1 = new Thread(ft);
        t1.start();

        //获取线程的返回值
        int i = (int)ft.get();
        System.out.println(i);
    }
}


/**
  这条线程的任务是创建一个100以内的随机数

 Callable可以指定泛型，也可以不指定泛型，如果不指定泛型，默认就是Object类型
 */
class  MyCallable implements Callable<Integer> {

    @Override
    public Integer call() throws Exception {
        Random ran = new Random();
        int i = ran.nextInt(100);
        return i;
    }
}
